git object
一つ一つのファイルが一つ一つのGItオブジェクト
オブジェクトのIDと中身
GitオブジェクトはIDで区別される
IDはGitオブジェクト名でもある
IDは40文字の16進数
.git/objects/内にこんな風にずらっとディレクトリが並んでいるが、これはIDの頭文字2文字になってる
https://gyazo.com/fe27b3d90a2f3a98a66d217a277942bb
中身は38文字のタイトルのオブジェクトになってる
オブジェクトの種類+(スペース)+データのサイズ+(\0)+データという入力を
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koseki2/20140420/20140420183844.png http://koseki.hatenablog.com/entry/2014/04/22/inside-git-1#2
IDはデータの中身のハッシュで決まるので、
ファイルの中身が同じなら、全世界の誰が作っても同じIDになる
後述するblobオブジェクトはファイルの中身を示すが、
A.txtとB.txtが全く同じ中身なら、blobオブジェクトは一つで済む
treeオブジェクトにはこんな風に書けばいい
code:tree
100644 A.txt \0 72943a16fb2c8f38f9dde202b7a70ccc19c52f34
100644 B.txt \0 72943a16fb2c8f38f9dde202b7a70ccc19c52f34
オブジェクト
Gitのデータベースを構成するもの
4種類ある
これら全てが.git/objects/内にごちゃまぜに入っている
名前だけ見てもどの種類のオブジェクトなのかは区別できない
ファイルに対応
$ git addしたときに作成される
tagに対応
ネタ
意図的にcommit hashの上位7桁を0にするやつ
ハッシュ化しているならどうやって差分を見ることができるの?
オブジェクトからどうやって実コードを復元してるの?
ハッシュって可逆だっけ?
くそでかプロジェクト全てのコードを毎回ハッシュしてんの?
流石にそんなこと無いよね?mrsekut.icon
Chromeのコードとかcommitするのにめっちゃ時間かかる、とかあるの?
参考
詳しい。イラストがわかりやすい